// 导入axios
import axios from 'axios'

// 创建axios的副本对象
const instance = axios.create({
  // baseURL: 'http://localhost:3000'
})

// 导入store
import store from '@/store/index'
// 导入router
import router from '@/router/index'
// 单独导入 饿了么UI的 的提示组件
import { Message } from 'element-ui'
// 导入获取token时间的方法
import { getTimeStamp, delTime } from './auth'
// 定义token的过期时间
const time = 2 * 60 * 60 * 1000

// 设置请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 判断token是否过期
    // 得到当前时间
    const currentTime = Date.now()
    // 得到token的保存时间
    const tokenTime = getTimeStamp()
    // 判断时间间隔是否超过有效期
    if (currentTime - tokenTime > time) {
      // 代码进到这里说明token已失效,清除用户信息和保存的token
      store.dispatch('user/logout')
      // 提示token过期
      Message.error('当前用户信息已失效，请重新登录')
      delTime()
      // 返回登录页
      router.push('/login')
      // 中断后续代码
      return Promise.reject(new Error('token已超过有效期'))
    }
    // 拿到store里的token
    const token = store.getters.token
    // 判断token是否存在
    if (token) {
      // 代码进到这里，说明token有值
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)
// 设置响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 成功时的回调函数
    // response 服务器响应回来的所有信息
    // return response  把服务器响应的数据传给外界

    // 判断本次请求是否成功，如果成功就返回正确的信息
    const { message, success } = response.data
    if (!success) {
      // 代码进到这里说明请求有误
      // 因为登录接口的返回没有设置错误状态码，所以用new Error
      return Promise.reject(new Error(message))
    }
    return response.data // 去除外层包裹的data
  },
  (error) => {
    // 失败时的回调函数 用于处理服务器返回状态为 4xx & 5xx 的响应
    // 处理token失效
    if (error.response?.data?.code === 10002) {
      // 调用vuex里user.js里的方法 清除用户信息和token
      store.dispatch('user/logout')
      // 跳转回登录页
      router.push('/login')
      // 跳转时弹出提示信息
      Message.error('登录信息已失效,请重新登录')
    }
    return Promise.reject(error)
  }
)

// 暴露axios对象
export default instance
